package com.example.empleemanagesystem.service.impl;

import com.example.empleemanagesystem.entity.Attendance;
import com.example.empleemanagesystem.repository.AttendanceRepository;
import com.example.empleemanagesystem.service.AttendanceService;
import com.example.empleemanagesystem.vo.AttendanceVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

// 标记这个类是一个服务层组件
@Service
public class AttendanceServiceImpl implements AttendanceService {

    // 通过Spring的依赖注入，自动装配一个AttendanceRepository类型的实例，用于调用数据访问层（与数据库交互）提供的考勤相关数据操作方法
    @Autowired
    private AttendanceRepository attendanceRepository;

    @Override
    public List<AttendanceVO> findAll() {
        // 调用AttendanceRepository的findAll方法获取数据库中所有的Attendance实体记录，然后通过Stream API进行映射转换
        return attendanceRepository.findAll().stream().map(attendance -> {
            AttendanceVO attendanceVO = new AttendanceVO();
            attendanceVO.setId(attendance.getId());
            attendanceVO.setNumber(attendance.getNumber());
            attendanceVO.setName(attendance.getName());
            attendanceVO.setArrive_late_times(attendance.getArrive_late_times());
            attendanceVO.setLeave_early_times(attendance.getLeave_early_times());
            return attendanceVO;
        }).collect(Collectors.toList());//对流中的元素进行最终的收集汇总，转换为一个列表
    }
    //用于解决空指针异常的问题
    @Override
    public Optional<Attendance> getByName(@NonNull String name) {
        // 调用AttendanceRepository的getAttendanceByName方法，根据传入的用户名去数据库中查找对应的考勤记录列表
        List<Attendance> result = attendanceRepository.getAttendanceByName(name);
        // 判断查找结果列表是否为空，如果为空则返回一个空的Optional对象，否则返回包含第一个查找结果的Optional对象
        return Optional.ofNullable(result.isEmpty()? null : result.get(0));
    }

    @Override
    public Optional<Attendance> getByNumber(@NonNull String number) {
        // 调用AttendanceRepository的getAttendanceByNumber方法，根据传入的员工编号去数据库中查找对应的考勤记录列表
        List<Attendance> result = attendanceRepository.getAttendanceByNumber(number);
        // 判断查找结果列表是否为空，如果为空则返回一个空的Optional对象，否则返回包含第一个查找结果的Optional对象
        return Optional.ofNullable(result.isEmpty()? null : result.get(0));
    }

    @Override
    public boolean create(@NonNull AttendanceVO attendanceVO) {
        // 创建一个新的Attendance实体对象，用于将从AttendanceVO中获取的数据进行重新封装，以便保存到数据库中
        Attendance attendance = new Attendance();
        attendance.setNumber(attendanceVO.getNumber());
        attendance.setName(attendanceVO.getName());
        attendance.setArrive_late_times(attendanceVO.getArrive_late_times());
        attendance.setLeave_early_times(attendanceVO.getLeave_early_times());
        try {
            // 调用AttendanceRepository的save方法将新创建的考勤记录保存到数据库中，保存成功后会返回保存后的Attendance对象（包含数据库生成的主键等信息）
            attendance = attendanceRepository.save(attendance);
            // 将保存后返回的Attendance对象的ID设置到传入的AttendanceVO对象中，保持数据的一致性
            attendanceVO.setId(attendance.getId());
            return true;
        } catch (Exception e) {
            // 如果在保存过程中出现异常，打印错误信息到标准错误输出流，并打印异常的堆栈跟踪信息，方便排查问题，然后返回false表示创建失败
            System.err.println("创建考勤记录出错！");
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public Attendance getById(@NonNull Long id) {
        // 调用AttendanceRepository的findById方法，根据传入的考勤记录ID去数据库中查找对应的考勤记录，如果找到则返回包含该记录的Optional对象，否则返回空的Optional对象，这里直接获取其中的值或者返回null
        return attendanceRepository.findById(id).orElse(null);
    }

    @Override
    public void deleteById(Long id) {
        try {
            // 调用AttendanceRepository的deleteById方法，根据传入的考勤记录ID去数据库中执行删除对应的考勤记录的操作
            attendanceRepository.deleteById(id);
        } catch (Exception e) {
            // 如果在删除过程中出现异常，打印错误信息到标准错误输出流，并打印异常的堆栈跟踪信息，方便排查问题
            System.err.println("删除考勤记录出错！");
            e.printStackTrace();
        }
    }
}